package com.study.modules.designPatterns.No3FactoryMode;

/**
 * 工厂模式
 * 定义：定义一个创建产品对象的工厂接口，将产品的创建过程延迟到工厂中完成。
 * 工厂模式的优点：
 * 1、一个调用者想创建一个对象，只要知道其名称就可以了，不需要知道其创建细节，甚至连产品的类都不知道。
 * 2、扩展性高，如果想增加一个产品，只要扩展一个工厂类就可以。
 * 3、屏蔽产品的具体实现，调用者只关心产品的接口。
 * 4、产品的抽象层次与具体产品的实现层次分离，提高了系统的灵活性，降低了模块的耦合度。
 * 缺点：
 * 1、产品必须有共同的接口。
 * 2、产品的创建具有最大的灵活性，需要对具体工厂类进行修改，当产品类型增加时，需要增加工厂类，对客户端不透明。
 * 3、由于考虑到系统的可扩展性，需要引入抽象层，在客户端代码中均使用抽象层进行定义，增加了系统的抽象性和理解难度。
 * 总结：
 * 工厂模式是简单工厂模式的进一步抽象和推广。工厂方法模式是简单工厂模式的进一步抽象和推广。
 * 工厂方法模式的优点在于，它将实例化操作延迟到具体工厂类中，而将产品的创建过程封装在具体工厂类中，使得具体工厂类可以被外界直接调用，而不需要依赖于产品类。
 * 工厂方法模式的缺点在于，增加新的产品时，需要增加新的具体工厂类，而且具体工厂类对调用者是透明的，增加新的具体工厂类需要修改工厂类的判断逻辑，违背了开闭原则。
 * 工厂方法模式适用情况包括：
 * 1、一个类不知道它所需要的对象的类。
 * 2、一个类通过其子类来指定创建哪个对象。
 * 3、提供一个产品类库，所有的产品以同样的接口出现，从而使客户端不依赖于具体实现。
 * 4、在层次化结构中，需要向下创建一组相关或相互依赖的对象。
 */
public class TestFactoryMode {

    public static void main(String[] args) {
        System.out.println("===========工厂模式测试===========");
        System.out.println(ProductFactory.getProduct("computer").search("华硕"));
        System.out.println(ProductFactory.getProduct("mobile").search("华为"));
        System.out.println(ProductFactory.getProduct("earphone").search("步行者"));
    }

}
